package com.jyxd.web.util;


import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import java.util.Iterator;

@SuppressWarnings("rawtypes")
public class ModifyJsonKeyUtil {

    /**
     * 修改JSON的key为小写或者大写
     *
     * @Title ModifyJsonKeyToUpperUtil
     * @Desripction
     * @Date 2019-3-7 下午3:05:48
     * @Package com.jane.framework.web.util
     */



        public static final String STRING_KEY = "String";

        public static final String JSONOBJECT_KEY = "JSONObject";

        public static final String JSONARRAY_KEY = "JSONArray";

        /**
         * 修改json的key为大写或者小写
         *
         * @Description
         * @Date 2019-3-7下午3:07:32
         * @param jsonObject
         * @param  transferMode 当值为true时，说明是转小写，false为转大写
         * @return
         * @throws
         */
        public static JSONObject transferJsonKey(JSONObject jsonObject, boolean transferMode) {
            JSONObject object = new JSONObject();
            Iterator iterator = jsonObject.keys();
            while (iterator.hasNext()) {
                String jsonKey = (String) iterator.next();
                Object valueObject = jsonObject.get(jsonKey);
                if (transferMode) {
                    jsonKey = jsonKey.toLowerCase();
                } else {
                    jsonKey = jsonKey.toUpperCase();
                }
                if (valueObject.getClass().toString().endsWith(STRING_KEY)) {
                    object.accumulate(jsonKey, valueObject);
                } else if (valueObject.getClass().toString().endsWith(JSONOBJECT_KEY)) {
                    JSONObject checkObject = JSONObject.fromObject(valueObject);
                    // 当值为null时，valueObject还是JSONObject对象，判空是不成立的，要判断是否是nullObject
                    if (!checkObject.isNullObject()) {
                        object.accumulate(jsonKey, transferJsonKey((JSONObject) valueObject, transferMode));
                    } else {
                        object.accumulate(jsonKey, null);
                    }
                } else if (valueObject.getClass().toString().endsWith(JSONARRAY_KEY)) {
                    object.accumulate(jsonKey, transferJsonArray(jsonObject.getJSONArray(jsonKey), transferMode));
                }
            }
            return object;
        }

        /**
         * JSONArray key大小写转换
         *
         * @Description
         * @Date 2019-3-7下午3:28:30
         * @param jsonArray
         * @param transferMode
         * @return
         * @throws
         */
        public static JSONArray transferJsonArray(JSONArray jsonArray, boolean transferMode) {
            JSONArray array = new JSONArray();
            if (null != jsonArray && jsonArray.size() > 0) {
                for (Object object : jsonArray) {
                    if (object.getClass().toString().endsWith(JSONOBJECT_KEY)) {
                        array.add(transferJsonKey((JSONObject) object, transferMode));
                    } else if (object.getClass().toString().endsWith(JSONARRAY_KEY)) {
                        array.add(transferJsonArray((JSONArray) object, transferMode));
                    }
                }
            }
            return array;
        }

        public static void main(String[] args) {
            String str = "{request:{body:{demography:{birthday:1946-06-24 00:00:00,cardList:[{cardClass:{identifier:,text:},cardNo:1122763,cardType:{identifier:,text:},majorIndicator:{identifier:,text:}}],career:{identifier:11894,text:农民},certificateList:[{cardClass:{identifier:,text:},cardNo:140402194606243239,cardType:身份证}],culture:{identifier:,text:},ethnicGroup:{identifier:1,text:汉族},localIndicator:{identifier:,text:},maritalStatus:{identifier:2,text:已婚},nationality:{identifier:1,text:中国},patientAddress:[{city:{identifier:,text:},companyName:,country:{identifier:,text:},houseNumber:,province:{identifier:,text:},streetAddress:,town:{identifier:,text:},type:H,zip:}],patientIdentifierList:[{idNumber:1122763,idType:PatientID}],patientName:李文长,phoneList:[{phoneType:H}],psychosisIndicator:{identifier:,text:},sex:{identifier:M,text:男性},ssn:140402194606243239},diagnosisList:[{diagnosisClass:{identifier:入院诊断,text:入院诊断},diagnosisCode:{identifier:},diagnosisDoc:{idNumber:0649,name:崔璐华},diagnosisTime:1641347855000,diagnosisType:{identifier:1,text:主要诊断},herbalistDiagnosisCode:{identifier:,text:}}],event:{eventCode:{identifier:PVM0501},eventFacility:{identifier:1001},operator:{department:{identifier:},name:},recordDatetime:1641347855000},extOfKinList:[{addressList:[{city:{identifier:,text:},companyName:,county:{identifier:,text:},houseNumber:,province:{identifier:,text:},streetAddress:,town:{identifier:,text:},type:H,zip:}],name:李文长,phoneList:[{phoneNumberST:,phoneType:H}],relationship:{identifier:8,text:},sex:{identifier:,text:},ssn:}],patientVisit:{babyVisitNumber:,criticalLevel:{identifier:,text:},dischargeWay:{identifier:,text:},handleList:[{department:{text:心血管内科},handleBy:{iDNumber:0649,name:崔璐华,role:{identifier:ResidentDoctor,text:住院医师}},handleTime:1641347837000,type:{identifier:Action,text:执行},ward:{identifier:63,text:心血管科护理站}}],patientClass:I,patientLocation:{bed:01,department:{identifier:001,text:心血管内科},room:219,ward:{identifier:63,text:心血管科护理站}},visitCount:1,visitNumber:14695130,visitStatus:{identifier:0,text:入院登记}}},head:{appId:HIS,appType:,callback:,contentEncoding:,contentType:Sync,licId:,messageId:4dfef438-9f39-47b8-923e-b367f1e545a2,orgId:1001,recAppId:PACS,securityContent:,securityPolicy:,timestamp:null,tranCode:,version:1.1}}}";
            JSONObject object = JSONObject.fromObject(str);
            object = transferJsonKey(object, true);
            System.out.println(object.toString());
        }

}
